#ifndef __KYO_DEBUG_H__
#define __KYO_DEBUG_H__

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define DEBUG0(...)
#define DEBUG1(...)     printf(__VA_ARGS__);
#define DEBUG2(...)     fprintf(stderr, __VA_ARGS__);
#define DEBUG3(...)     perror(__VA_ARGS__);

#define ERRP(con, ret, flag, ...)     do                \
                    {                                   \
                        if (con)                        \
                        {                               \
                            DEBUG##flag(__VA_ARGS__)    \
                            ret;                        \
                        }                               \
                    } while (0)

#define FFLUSH_STDIN    while (getchar() != '\n')

#define KYO_GETVAL(val, type, ...)    do    \
        {                                   \
            int ret = 0;                    \
                                            \
            while (!ret)                    \
            {                               \
                printf(__VA_ARGS__);        \
                ret = scanf(type, &val);    \
                FFLUSH_STDIN;               \
            }                               \
        } while (0)

#define KYO_GETSTRLEN(buf, size, len, ...)     do   \
        {                                           \
            printf(__VA_ARGS__);                    \
            fgets(buf, size, stdin);                \
            len = strlen(buf);                      \
            if (buf[len - 1] == '\n')               \
                buf[--len] = '\0';                  \
            else                                    \
                FFLUSH_STDIN;                       \
        } while (0)

#define KYO_GETSTR(buf, size, ...)      do              \
        {                                               \
            int len;                                    \
            KYO_GETSTRLEN(buf, size, len, __VA_ARGS__); \
        } while (0)

#endif /* __KYO_DEBUG_H__ */
